/**
 * 方法匹配器接口，用于确定某个方法是否符合匹配条件
 * 主要用于AOP（面向切面编程）中，决定哪些方法需要应用切面逻辑
 */
package com.test.aop;

import java.lang.reflect.Method;

public interface MethodMatcher {

    /**
     * 判断给定方法和目标类是否匹配
     * 此方法主要用于静态匹配，不考虑方法执行时的参数
     *
     * @param method 要检查的方法
     * @param targetClass 目标类
     * @return 如果方法和目标类匹配则返回true，否则返回false
     */
    boolean matches(Method method, Class<?> targetClass);

    /**
     * 判断匹配是否在运行时进行
     * 如果返回true，则表示匹配逻辑需要在运行时，根据方法参数等动态信息来确定
     * 如果返回false，则表示匹配逻辑是静态的，即在编译时或类加载时确定
     *
     * @return 如果匹配在运行时进行则返回true，否则返回false
     */
    boolean isRuntime();

    /**
     * 判断给定方法、目标类和方法参数是否匹配
     * 此方法用于动态匹配，考虑方法执行时的参数
     * 当isRuntime()返回true时，此方法才会被调用
     *
     * @param method 要检查的方法
     * @param targetClass 目标类
     * @param args 方法参数
     * @return 如果方法、目标类和方法参数匹配则返回true，否则返回false
     */
    boolean matches(Method method, Class<?> targetClass, Object... args);

    /**
     * 预定义的总是返回true的方法匹配器
     * 当不需要对方法进行任何筛选时，可以使用这个匹配器
     * 它的三个方法实现都返回true，表示所有方法都匹配
     */
    MethodMatcher TRUE = new MethodMatcher() {

        @Override
        public boolean matches(Method method, Class<?> targetClass) {
            return true;
        }

        @Override
        public boolean isRuntime() {
            return false;
        }

        @Override
        public boolean matches(Method method, Class<?> targetClass, Object... args) {
            return true;
        }
    };

}
